已知问题与需求分析
现在的 BQ IC Driver 有一个大 Bug。
在接上电池的时候,Battery、Battery+TypeC、Battery+DC 都是可以正常开机的。
但是没有电池的时候,单独 TypeC 或者 DC 开机是有问题的。
RK 反馈他们那边也有这个问题,定位问题在于 bq25600_hw_init ,BQ IC 的初始化配置。
当屏蔽该函数的时候,单独 TypeC 或者 DC 是可以正常开机的。
但是电池的正常工作又必须依赖于它的初始化。
解决思路
三条:
- 寻找 DC / TypeC 开机时对 BQ IC 寄存器初始化的操作 和 bq_hw_init 中进行的操作对比。
- 在 dts 中配置一个标志位,has_battery,当 has_battery = 1 的时候,加载 bq_hw_init ,没有的时候屏蔽 bq_hw_init
- 利用 cw2015 电量计 IC ,检测是否有无电池,并根据检测结果决定是否屏蔽 bq_hw_init。
1 当然是正解。
但是寻求了 BQ IC FAE 的帮助,无果,他们反馈理论上 bq_hw_init 中的配置是没问题的,不因采用哪种供电方式而发生改变。
2 缺陷是会生成两套 resource.img ,根据不同的条件使用不同的 resource.img ,这显然是不好的
3 需要移植 cw2015。
综上,只能选择第三种方式了
代码移植
dts
dts 中 对于 cw2015 的配置
1 | cw2015@62 { |
Makefile 和 Kconfig
//Todo
obj-y
cw2015_battery.c
修改 cw2015_battery 的代码是适用于 rk3288 平台的,有些接口进行了升级。
包括 i2c_master_reg8_send/write 和 register_power_supply
并且我们还 定义了 have_battery 标志位,判断出电池有无,并将标志位送给 bq 进行下一步电池初始化的操作。
1 | diff --git a/drivers/power/cw2015_battery.c b/drivers/power/cw2015_battery.c |
bq25700_charger.c
在 bq 中我们会根据 cw 中获得到的电池的状态来操作 是否进行 BQ IC 寄存器的初始化(hw_init)
1 | --- a/drivers/power/bq25700_charger.c |
验证结果
1 | ls sys/class/power_supply/ |
可以看到四个设备
bq25700_charger rk_ac rk_usb rk_bat
bq25700_charger 是在 bq 中注册的 Type = POWER_SUPPLY_TYPE_USB 的设备
rk_ac 是在 cw 中注册的 Type = POWER_SUPPLY_TYPE_MAINS 的设备
rk_usb 是在 cw 中注册的 Type = POWER_SUPPLY_TYPE_USB 的设备
rk_bat 是在 cw 中注册的 Type = POWER_SUPPLY_TYPE_BATTERY 的设备
均注册正常。
而且无论是否接电池,现在都可以正常开机。